package com.app.framework.utils;

import com.app.exception.BusinessException;
import org.springframework.beans.BeanUtils;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;

/**
 * 对象复制工具类
 */
public class CoBeanUtils {

    /**
     * 将一个对象复制到另一个对象
     *
     * @param source 源对象
     * @param target 目标对象
     */
    public static void copyProperties(Object source, Object target) {
        BeanUtils.copyProperties(source, target);
    }

    /**
     * 将源列表中的对象属性复制到目标类型的对象列表中
     *
     * @param sList  源对象列表
     * @param TClass 目标对象类型
     * @param <T>    目标对象类型参数
     * @param <S>    源对象类型参数
     */
    public static <T, S> List<T> copyList(List<S> sList, Class<T> TClass) {
        List<T> list = new ArrayList<>();
        for (S s : sList) {
            T t = createInstance(TClass);
            BeanUtils.copyProperties(s, t);
            list.add(t);
        }
        return list;
    }

    /**
     * 将源对象的属性复制到目标类型的对象中
     *
     * @param s      源对象
     * @param TClass 目标对象类型
     * @param <T>    目标对象类型参数
     * @param <S>    源对象类型参数
     */
    public static <T, S> T copy(S s, Class<T> TClass) {
        T t = createInstance(TClass);
        BeanUtils.copyProperties(s, t);
        return t;
    }

    /**
     * 创建目标类型的对象实例
     *
     * @param TClass 目标对象类型
     * @param <T>    目标对象类型参数
     */
    private static <T> T createInstance(Class<T> TClass) {
        T t;
        try {
            Constructor<T> constructor = TClass.getDeclaredConstructor();
            constructor.setAccessible(true);
            t = constructor.newInstance();
        } catch (Exception e) {
            throw new BusinessException("转换错误");
        }
        return t;
    }

}